/*-------------------------------------------------------------------------
 *
 * queryenvironment.h
 *	  访问用于修改查询环境和检索与条目相关的实际数据的函数（如果有）。
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/utils/queryenvironment.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef QUERYENVIRONMENT_H
#define QUERYENVIRONMENT_H

#include "access/tupdesc.h"


typedef enum EphemeralNameRelationType
{
	ENR_NAMED_TUPLESTORE		/* 具名元组存储关系；例如，增量 */
} EphemeralNameRelationType;

/*
 * 一些短暂的命名关系必须与某些关系匹配（例如，触发器过渡表），因此为了正确处理缓存的计划和 DDL，
 * 我们应该携带该关系的 OID。在其他情况下，ENR 可能与存储在系统目录中的任何关系无关，
 * 所以我们需要能够直接存储 TupleDesc。我们从不需要两者。
 */
typedef struct EphemeralNamedRelationMetadataData
{
	char	   *name;			/* 用于识别关系的名称 */

	/* 下面的两个字段中只应使用一个 */
	Oid			reliddesc;		/* 获取 tupdesc 的关系 oid */
	TupleDesc	tupdesc;		/* 结果行的描述 */

	EphemeralNameRelationType enrtype;	/* 用于识别关系类型 */
	double		enrtuples;		/* 估计元组数量 */
} EphemeralNamedRelationMetadataData;

typedef EphemeralNamedRelationMetadataData *EphemeralNamedRelationMetadata;

/*
 * 短暂命名关系数据；用于解析不在目录中的命名关系，
 * 如 AFTER 触发器中的过渡表。
 */
typedef struct EphemeralNamedRelationData
{
	EphemeralNamedRelationMetadataData md;
	void	   *reldata;		/* 用于执行时访问数据的结构 */
} EphemeralNamedRelationData;

typedef EphemeralNamedRelationData *EphemeralNamedRelation;

/*
 * 这是一个在 queryenvironment.c 之外的不透明结构。
 * 其意图是能够更改实现或添加新上下文特性，而无需更改现有代码以便使用现有特性。
 */
typedef struct QueryEnvironment QueryEnvironment;


extern QueryEnvironment *create_queryEnv(void);
extern EphemeralNamedRelationMetadata get_visible_ENR_metadata(QueryEnvironment *queryEnv, const char *refname);
extern void register_ENR(QueryEnvironment *queryEnv, EphemeralNamedRelation enr);
extern void unregister_ENR(QueryEnvironment *queryEnv, const char *name);
extern EphemeralNamedRelation get_ENR(QueryEnvironment *queryEnv, const char *name);
extern TupleDesc ENRMetadataGetTupDesc(EphemeralNamedRelationMetadata enrmd);

#endif							/* QUERYENVIRONMENT_H */
